#ifndef DEFAULT_MOTION_STATE_H
#define DEFAULT_MOTION_STATE_H

///The btDefaultMotionState provides a common implementation to synchronize world transforms with offsets.
struct	btDefaultMotionState : public btMotionState
{
    btTransform m_graphicsWorldTrans;
    btTransform	m_centerOfMassOffset;
    btTransform m_startWorldTrans;
    void*		m_userPointer;

    btDefaultMotionState(const btTransform& startTrans = btTransform::getIdentity(), const btTransform& centerOfMassOffset = btTransform::getIdentity())
        : m_graphicsWorldTrans(startTrans),
          m_centerOfMassOffset(centerOfMassOffset),
          m_startWorldTrans(startTrans),
          m_userPointer(0)

    {
    }

    ///synchronizes world transform from user to physics
    virtual void	getWorldTransform(btTransform& centerOfMassWorldTrans) const
    {
        centerOfMassWorldTrans = 	m_centerOfMassOffset.inverse() * m_graphicsWorldTrans ;
    }

    ///synchronizes world transform from physics to user
    ///Bullet only calls the update of worldtransform for active objects
    virtual void	setWorldTransform(const btTransform& centerOfMassWorldTrans)
    {
        m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset ;
    }



};

#endif //DEFAULT_MOTION_STATE_H
